﻿using System;
using System.Runtime.InteropServices;
using Extensibility;
using Microsoft.Vbe.Interop;
using 枸杞;
using 枸杞VBE插件.Attributes;
using static 枸杞VBE插件.VBEHelper;

namespace 枸杞VBE插件;

[ComVisible(true)]
[Guid("4A961053-28EB-43BD-B05F-061EE80BAFE5")]
[ProgId("枸杞VBE插件")]
public class ThisAddin : IDTExtensibility2, Rougamo.IRougamo<LogAttribute>
{
    private VBEHelper? _vbeHelper;

    /// <summary>
    /// 在连接COM加载项时发生。
    /// </summary>
    /// <param name="Application">Application参数是COM加载项所附加到的Application对象，VBE加载项对应的就是VBE对象。</param>
    /// <param name="ConnectMode">ConnectMode参数指定COM加载项的连接方式。
    /// <para>ext_cm_Startup：COM加载项在程序启动时连接。</para>
    /// <para>ext_cm_AfterStartup：COM加载项在程序启动后，手动启用时连接。</para>
    /// <para>其他连接方式忽略，用不到。</para>
    /// </param>
    /// <param name="AddInInst"></param>
    /// <param name="custom"></param>
    public void OnConnection(object Application, ext_ConnectMode ConnectMode, object AddInInst, ref Array custom)
    {
        _vbeHelper = new(this, (VBE)Application, (AddIn)AddInInst);

        if (ConnectMode != ext_ConnectMode.ext_cm_Startup)//用户手动加载时不触发OnStartupComplete,强制触发
        {
            OnStartupComplete(ref custom);
        }
    }

    /// <summary>
    ///如果COM加载项在启动时连接，则在程序完成其启动时发生。如果程序启动时未连接加载项，即使用户在“COM加载项”对话框或“外接程序管理器”对话框中手动连接该加载项，也不会发生此事件。
    /// </summary>
    /// <param name="custom"></param>
    public void OnStartupComplete(ref Array custom)
    {
        ThisAddIn_Startup();
    }

    /// <summary>
    ///在COM加载项断开连接时发生。
    /// </summary>
    /// <param name="RemoveMode">RemoveMode参数指定COM加载项断开连接的方式。
    /// <para>ext_dm_HostShutdown外接程序在程序关闭时断开连接</para>
    /// <para>ext_dm_UserClosed外接程序在用户手动取消时断开连接</para>
    /// <para>其他方式忽略,用不到</para>
    /// </param>
    /// <param name="custom"></param>
    public void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom)
    {
        if (RemoveMode != ext_DisconnectMode.ext_dm_HostShutdown)//用户手动取消加载时不触发OnBeginShutdown,强制触发
        {
            OnBeginShutdown(ref custom);
        }
    }

    /// <summary>
    /// 如果COM加载项已连接，则在程序开始关闭时发生。
    /// </summary>
    /// <param name="custom"></param>
    public void OnBeginShutdown(ref Array custom)
    {
        ThisAddIn_Shutdown();
    }

    /// <summary>
    /// 当连接的COM外接程序集发生更改时，即当任何其他外接程序连接或断开连接时发生。
    /// </summary>
    /// <param name="custom"></param>
    public void OnAddInsUpdate(ref Array custom)
    {
        //没有用
    }

    private void ThisAddIn_Startup()
    {
        _vbeHelper?.Initialize();
    }

    private void ThisAddIn_Shutdown()
    {
        _vbeHelper?.Dispose();
    }
}